gadget: Add a has_content vfunc
authorMatthias Clasen <mclasen@redhat.com>
Sat, 6 Aug 2016 21:23:24 +0000 (17:23 -0400)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 18 Oct 2016 10:49:12 +0000 (11:49 +0100)
...and implement it for GtkCssGadget and GtkCssCustomGadget.
This allows us to decide on a per-object basis if a custom
gadget needs a render node for content or not.

gtk/gtkcsscustomgadget.c
gtk/gtkcssgadget.c
gtk/gtkcssgadgetprivate.h

index 60a1881ba9b4c32e735b6e0041a5030497fc25bd..7cf9096eed20c5733dd621ef5ec3b66d34a9a95d 100644 (file)
@@ -161,6 +161,14 @@ gtk_css_custom_gadget_draw (GtkCssGadget *gadget,
     return GTK_CSS_GADGET_CLASS (gtk_css_custom_gadget_parent_class)->draw (gadget, cr, x, y, width, height);
 }
 
+static gboolean
+gtk_css_custom_gadget_has_content (GtkCssGadget *gadget)
+{
+  GtkCssCustomGadgetPrivate *priv = gtk_css_custom_gadget_get_instance_private (GTK_CSS_CUSTOM_GADGET (gadget));
+
+  return priv->draw_func != NULL;
+}
+
 static void
 gtk_css_custom_gadget_finalize (GObject *object)
 {
@@ -183,6 +191,7 @@ gtk_css_custom_gadget_class_init (GtkCssCustomGadgetClass *klass)
   gadget_class->get_preferred_size = gtk_css_custom_gadget_get_preferred_size;
   gadget_class->allocate = gtk_css_custom_gadget_allocate;
   gadget_class->draw = gtk_css_custom_gadget_draw;
+  gadget_class->has_content = gtk_css_custom_gadget_has_content;
 }
 
 static void
index 1074d1a7ec570bc33ab1ed63a4c444d9d322c5aa..b89c41b424695a46e97eeb6df9050731bc9d0ffe 100644 (file)
@@ -242,7 +242,6 @@ gtk_css_gadget_set_property (GObject      *object,
   }
 }
 
-
 static void
 gtk_css_gadget_finalize (GObject *object)
 {
@@ -253,6 +252,14 @@ gtk_css_gadget_finalize (GObject *object)
   G_OBJECT_CLASS (gtk_css_gadget_parent_class)->finalize (object);
 }
 
+static gboolean
+gtk_css_gadget_has_content (GtkCssGadget *gadget)
+{
+  GtkCssGadgetClass *gadget_class = GTK_CSS_GADGET_GET_CLASS (gadget);
+
+  return gadget_class->draw != gtk_css_gadget_real_draw;
+}
+
 static void
 gtk_css_gadget_class_init (GtkCssGadgetClass *klass)
 {
@@ -266,6 +273,7 @@ gtk_css_gadget_class_init (GtkCssGadgetClass *klass)
   klass->allocate = gtk_css_gadget_real_allocate;
   klass->draw = gtk_css_gadget_real_draw;
   klass->style_changed = gtk_css_gadget_real_style_changed;
+  klass->has_content = gtk_css_gadget_has_content;
 
   properties[PROP_NODE] = g_param_spec_object ("node", "Node",
                                                "CSS node",
@@ -904,7 +912,7 @@ gtk_css_gadget_get_render_node (GtkCssGadget  *gadget,
                                       graphene_point3d_init (&tmp, -contents_x, -contents_y, 0));
 
       /* If there's an override in place, create a temporary node */
-      if (gadget_class->draw != gtk_css_gadget_real_draw)
+      if (gadget_class->has_content (gadget))
         {
           content_node = gsk_renderer_create_render_node (renderer);
 
index 94a0630959ed67dd2e3bae32e1bc21278bdbe32d..54c6132551728e20a856626e755ec088c4dd5f6c 100644 (file)
@@ -70,6 +70,8 @@ struct _GtkCssGadgetClass
 
   void          (* style_changed)                       (GtkCssGadget           *gadget,
                                                          GtkCssStyleChange      *change);
+
+  gboolean      (* has_content)                         (GtkCssGadget           *gadget);
 };
 
 GType           gtk_css_gadget_get_type                 (void) G_GNUC_CONST;
@@ -143,6 +145,7 @@ void            gtk_css_gadget_get_content_allocation   (GtkCssGadget
                                                          GtkAllocation          *allocation,
                                                          int                    *baseline);
 
+
 G_END_DECLS
 
 #endif /* __GTK_CSS_GADGET_PRIVATE_H__ */